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()); } }