public MultiShopData(MultiShopController multiShop)
        {
            transform = new SerializableTransform(multiShop.transform);
            name      = multiShop.name.Replace("(Clone)", "");

            foreach (var item in (GameObject[])getTerminalGameObjects.GetValue(multiShop))
            {
                var shopTerminal = item.GetComponent <ShopTerminalBehavior>();

                itemIndexes.Add((int)shopTerminal.GetFieldValue <PickupIndex>("pickupIndex").itemIndex);
                hidden.Add((bool)shopTerminal.pickupIndexIsHidden);
            }

            cost      = multiShop.GetFieldValue <int>("cost");
            available = multiShop.GetFieldValue <bool>("available");
        }
Beispiel #2
0
        public static void RepopulateTerminals(MultiShopController multiShopController, ItemTierShopConfig itemTierConfig)
        {
            GameObject[] terminalGameObjects = multiShopController.GetFieldValue <GameObject[]>("terminalGameObjects");
            for (int i = 0; i < multiShopController.terminalPositions.Length; i++)
            {
                List <PickupIndex> otherItemsList = new List <PickupIndex>();
                PickupIndex        newPickupIndex = PickupIndex.none;
                Xoroshiro128Plus   treasureRng    = Run.instance.treasureRng;
                switch (itemTierConfig.itemTier)
                {
                case ItemTier.Tier1:
                    newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableTier1DropList);
                    break;

                case ItemTier.Tier2:
                    newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableTier2DropList);
                    break;

                case ItemTier.Tier3:
                    newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableTier3DropList);
                    break;

                case ItemTier.Lunar:
                    newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableLunarDropList);
                    break;

                case ItemTier.Boss:
                    otherItemsList = new List <PickupIndex>();
                    var bossItemIndexList = R2API.ItemDropAPI.GetDefaultDropList(ItemTier.Boss);
                    foreach (var itemIndex in bossItemIndexList)
                    {
                        otherItemsList.Add(new PickupIndex(itemIndex));
                    }
                    newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(otherItemsList);
                    break;

                case ItemTier.NoTier:
                    if (itemTierConfig.isEquipment)
                    {
                        otherItemsList = new List <PickupIndex>();
                        var equipmentIndexList = R2API.ItemDropAPI.GetDefaultEquipmentDropList();
                        foreach (var itemIndex in equipmentIndexList)
                        {
                            otherItemsList.Add(new PickupIndex(itemIndex));
                        }
                        newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(otherItemsList);
                        //self.itemTier = ItemTier.Tier1;
                    }
                    break;
                }
                bool newHidden = Run.instance.treasureRng.nextNormalizedFloat < 0.2f;
                terminalGameObjects[i].GetComponent <ShopTerminalBehavior>().SetPickupIndex(newPickupIndex, newHidden);
            }
        }
Beispiel #3
0
 private void RaiseMultishopPrices(On.RoR2.MultiShopController.orig_Start orig, MultiShopController self)
 {
     orig(self);
     self.Networkcost = (int)(self.Networkcost * config.multiShopPriceCoefficient.Value);
     if (self.GetFieldValue <GameObject[]>("terminalGameObjects") is GameObject[] terminalGameObjects)
     {
         GameObject[] array = terminalGameObjects;
         for (int i = 0; i < array.Length; i++)
         {
             PurchaseInteraction component = array[i].GetComponent <PurchaseInteraction>();
             component.Networkcost = self.Networkcost;
             component.costType    = self.costType;
         }
     }
 }
Beispiel #4
0
        private void MultishopNoDuplicates(On.RoR2.MultiShopController.orig_CreateTerminals orig, MultiShopController self)
        {
            orig(self);


            List <ShopTerminalBehavior> terminalBehaviors = new List <ShopTerminalBehavior>();

            foreach (GameObject gameObject in self.GetFieldValue <GameObject[]>("terminalGameObjects"))
            {
                if (gameObject.GetComponent <ShopTerminalBehavior>())
                {
                    terminalBehaviors.Add(gameObject.GetComponent <ShopTerminalBehavior>());
                }
            }

            List <PickupIndex> pickups = new List <PickupIndex>();

            foreach (ShopTerminalBehavior shopTerminalBehavior in terminalBehaviors)
            {
                pickups.Add(shopTerminalBehavior.NetworkpickupIndex);
            }

            foreach (ShopTerminalBehavior shopTerminalBehavior in terminalBehaviors)
            {
                if (pickups.FindAll(x => x == shopTerminalBehavior.NetworkpickupIndex).Count > 1)
                {
                    switch (self.itemTier)
                    {
                    case ItemTier.Tier1:
                        shopTerminalBehavior.SetPickupIndex(Run.instance.treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableTier1DropList));
                        break;

                    case ItemTier.Tier2:
                        shopTerminalBehavior.SetPickupIndex(Run.instance.treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableTier2DropList));
                        break;

                    case ItemTier.Tier3:
                        shopTerminalBehavior.SetPickupIndex(Run.instance.treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableTier3DropList));
                        break;

                    case ItemTier.Lunar:
                        shopTerminalBehavior.SetPickupIndex(Run.instance.treasureRng.NextElementUniform <PickupIndex>(Run.instance.availableLunarDropList));
                        break;
                    }
                }
            }
        }
Beispiel #5
0
        public void SpawnShop(Xoroshiro128Plus xoroshiro128Plus)
        {
            SpawnCard  card = Resources.Load <SpawnCard>("SpawnCards/InteractableSpawnCard/iscTripleShop");
            GameObject multiShopGameObject = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest(card, new DirectorPlacementRule
            {
                maxDistance   = 30f,
                minDistance   = 10f,
                placementMode = DirectorPlacementRule.PlacementMode.Approximate,
                position      = TeleporterInteraction.instance.transform.position
            }, xoroshiro128Plus));

            float   startPosOffsetY = 0; // -7.2f;
            Vector3 endPosition     = multiShopGameObject.transform.position;

            multiShopGameObject.transform.position = new Vector3(multiShopGameObject.transform.position.x, multiShopGameObject.transform.position.y + startPosOffsetY, multiShopGameObject.transform.position.z);

            MultiShopController        multiShopController     = multiShopGameObject.GetComponent <MultiShopController>();
            List <PurchaseInteraction> purchaseInteractionList = new List <PurchaseInteraction>();

            GameObject[] terminalGameObjects = multiShopController.GetFieldValue <GameObject[]>("terminalGameObjects");
            for (int k = 0; k < terminalGameObjects.Length; k++)
            {
                purchaseInteractionList.Add(terminalGameObjects[k].GetComponent <PurchaseInteraction>());
                terminalGameObjects[k].gameObject.transform.position = new Vector3(terminalGameObjects[k].gameObject.transform.position.x, terminalGameObjects[k].gameObject.transform.position.y + startPosOffsetY, terminalGameObjects[k].gameObject.transform.position.z);
            }

            //EffectManager.instance.SpawnEffect(Resources.Load<GameObject>("Prefabs/Effects/BeetleQueenBurrow"), new EffectData()
            EffectManager.instance.SpawnEffect(Resources.Load <GameObject>("Prefabs/Effects/TeleportOutBoom"), new EffectData()
            {
                origin   = endPosition,
                rotation = Quaternion.identity
            }, true);

            MultiShop.terminalOffset = Math.Abs(terminalGameObjects[0].gameObject.transform.position.y - multiShopGameObject.transform.position.y);

            MultiShop multiShop = new MultiShop
            {
                multiShopController          = multiShopController,
                terminalPurchaseInteractions = purchaseInteractionList,
                endPosition = endPosition
            };

            MultiShop.instances.Add(multiShop);
        }
Beispiel #6
0
        public static void CreateTerminals(On.RoR2.MultiShopController.orig_CreateTerminals orig, MultiShopController self, ItemTierShopConfig itemTierConfig)
        {
            // Boss Items and Equipment can not be part of multi shops by default, so needs a special case
            List <PickupIndex> otherItemsList = new List <PickupIndex>();

            if (itemTierConfig.itemTier == ItemTier.Boss)
            {
                var itemIndexList = R2API.ItemDropAPI.GetDefaultDropList(ItemTier.Boss);
                foreach (var itemIndex in itemIndexList)
                {
                    otherItemsList.Add(new PickupIndex(itemIndex));
                }
            }
            else if (itemTierConfig.itemTier == ItemTier.NoTier && itemTierConfig.isEquipment)
            {
                var itemIndexList = R2API.ItemDropAPI.GetDefaultEquipmentDropList();
                foreach (var itemIndex in itemIndexList)
                {
                    otherItemsList.Add(new PickupIndex(itemIndex));
                }
            }
            if (otherItemsList.Count > 0)
            {
                self.SetFieldValue("terminalGameObjects", new GameObject[self.terminalPositions.Length]);
                for (int i = 0; i < self.terminalPositions.Length; i++)
                {
                    PickupIndex      newPickupIndex = PickupIndex.none;
                    Xoroshiro128Plus treasureRng    = Run.instance.treasureRng;
                    newPickupIndex = treasureRng.NextElementUniform <PickupIndex>(otherItemsList);
                    bool       newHidden  = Run.instance.treasureRng.nextNormalizedFloat < 0.2f;
                    GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>(self.terminalPrefab, self.terminalPositions[i].position, self.terminalPositions[i].rotation);
                    self.GetFieldValue <GameObject[]>("terminalGameObjects")[i] = gameObject;
                    gameObject.GetComponent <ShopTerminalBehavior>().SetPickupIndex(newPickupIndex, newHidden);
                    NetworkServer.Spawn(gameObject);
                }
                return;
            }

            orig(self);
        }