Beispiel #1
0
 public static void OnPostOpenBullshit(Action <Chest, List <Transform> > orig, Chest self, List <Transform> transrights)
 {
     try
     {
         List <DebrisObject> list = new List <DebrisObject>();
         bool      isRainbowRun   = GameStatsManager.Instance.IsRainbowRun;
         Type      chesttype      = typeof(Chest);
         FieldInfo _forceDropOkayForRainbowRun = chesttype.GetField("m_forceDropOkayForRainbowRun", BindingFlags.NonPublic | BindingFlags.Instance);
         if (isRainbowRun && !self.IsRainbowChest && !(bool)_forceDropOkayForRainbowRun.GetValue(self))
         {
             Vector2 a;
             if (self.spawnTransform != null)
             {
                 a = self.spawnTransform.position;
             }
             else
             {
                 Bounds bounds = self.sprite.GetBounds();
                 a = self.transform.position + bounds.extents;
             }
             FieldInfo _room = chesttype.GetField("m_room", BindingFlags.NonPublic | BindingFlags.Instance);
             LootEngine.SpawnBowlerNote(GameManager.Instance.RewardManager.BowlerNoteChest, a + new Vector2(-0.5f, -2.25f), (RoomHandler)_room.GetValue(self), true);
         }
         else
         {
             for (int i = 0; i < self.contents.Count; i++)
             {
                 List <DebrisObject> list2 = LootEngine.SpewLoot(new List <GameObject>
                 {
                     self.contents[i].gameObject
                 }, transrights[i].position);
                 list.AddRange(list2);
                 for (int j = 0; j < list2.Count; j++)
                 {
                     if (list2[j])
                     {
                         list2[j].PreventFallingInPits = true;
                     }
                     if (!(list2[j].GetComponent <Gun>() != null))
                     {
                         if (!(list2[j].GetComponent <CurrencyPickup>() != null))
                         {
                             if (list2[j].specRigidbody != null)
                             {
                                 list2[j].specRigidbody.CollideWithOthers = false;
                                 DebrisObject debrisObject      = list2[j];
                                 MethodInfo   _BecomeViableItem = chesttype.GetMethod("BecomeViableItem", BindingFlags.NonPublic | BindingFlags.Instance);
                                 debrisObject.OnTouchedGround += (Action <DebrisObject>)_BecomeViableItem.Invoke(self, new object[] { debrisObject });
                             }
                         }
                     }
                 }
             }
         }
         if (self.IsRainbowChest && isRainbowRun && self.transform.position.GetAbsoluteRoom() == GameManager.Instance.Dungeon.data.Entrance)
         {
             MethodInfo _HandleRainbowRunLootProcessing = chesttype.GetMethod("HandleRainbowRunLootProcessing", BindingFlags.NonPublic | BindingFlags.Instance);
             GameManager.Instance.Dungeon.StartCoroutine((IEnumerator)_HandleRainbowRunLootProcessing.Invoke(self, new object[] { list }));
         }
         if (god.ContainsKey(self))
         {
             List <Tuple <int, int> > choices = god[self];
             foreach (Tuple <int, int> choice in choices)
             {
                 DebrisObject firstItem  = GetItemFromListByID(list, choice.First);
                 DebrisObject secondItem = GetItemFromListByID(list, choice.Second);
                 if (firstItem && secondItem)
                 {
                     GameManager.Instance.Dungeon.StartCoroutine(ItemChoiceCoroutine(firstItem, secondItem));
                 }
             }
         }
     }
     catch (Exception error)
     {
         ETGModConsole.Log(error.ToString());
     }
 }