// changing oxygen breather to accumulate oxygen
        public static void Postfix(OxygenBreather __instance, ref float dt)
        {
            if (!__instance.gameObject.HasTag(GameTags.Dead))
            {
                float num = Traverse.Create(__instance).Field("airConsumptionRate").Method("GetTotalValue").GetValue <float>() * dt;

                bool flag = Traverse.Create(__instance).Field("gasProvider").Method("ConsumeGas", __instance, num).GetValue <bool>();
                if (flag)
                {
                    // add oxygen to storage
                    __instance.GetComponents <Storage>()[1].AddGasChunk(SimHashes.Oxygen, num, Traverse.Create(__instance).Field("temperature").Field("value").GetValue <float>(), byte.MaxValue, 0, false, true);

                    if (Traverse.Create(__instance).Field("gasProvider").Method("ShouldEmitCO2").GetValue <bool>())
                    {
                        float num2 = num * __instance.O2toCO2conversion;

                        Game.Instance.accumulators.Accumulate(Traverse.Create(__instance).Field("co2Accumulator").GetValue <HandleVector <int> .Handle>(), num2);
                        __instance.accumulatedCO2 += num2;
                        if (__instance.accumulatedCO2 >= __instance.minCO2ToEmit)
                        {
                            GameObject     o2Chunk          = __instance.GetComponents <Storage>()[1].FindFirst(SimHashes.Oxygen.CreateTag());
                            PrimaryElement primaryElementO2 = o2Chunk.GetComponent <PrimaryElement>();
                            primaryElementO2.Mass -= o2_fraction_of_co2 * __instance.minCO2ToEmit;

                            __instance.accumulatedCO2 -= __instance.minCO2ToEmit;
                            Vector3 position = __instance.transform.GetPosition();
                            position.x += ((!Traverse.Create(__instance).Field("facing").GetValue <Facing>().GetFacing()) ? __instance.mouthOffset.x : (-__instance.mouthOffset.x));
                            position.y += __instance.mouthOffset.y;
                            position.z -= 0.5f;
                            CO2Manager.instance.SpawnBreath(position, __instance.minCO2ToEmit, Traverse.Create(__instance).Field("temperature").Field("value").GetValue <float>());
                        }
                    }
                    else if (Traverse.Create(__instance).Field("gasProvider").Method("ShouldStoreCO2").GetValue <bool>())
                    {
                        Equippable equippable = __instance.GetComponent <SuitEquipper>().IsWearingAirtightSuit();
                        if (equippable != null)
                        {
                            float num3 = num * __instance.O2toCO2conversion;
                            Game.Instance.accumulators.Accumulate(Traverse.Create(__instance).Field("co2Accumulator").GetValue <HandleVector <int> .Handle>(), num3);
                            __instance.accumulatedCO2 += num3;
                            if (__instance.accumulatedCO2 >= __instance.minCO2ToEmit)
                            {
                                GameObject     o2Chunk          = __instance.GetComponents <Storage>()[1].FindFirst(SimHashes.Oxygen.CreateTag());
                                PrimaryElement primaryElementO2 = o2Chunk.GetComponent <PrimaryElement>();
                                primaryElementO2.KeepZeroMassObject = true;                            // makes sure the mass doesn't go negative
                                primaryElementO2.Mass -= o2_fraction_of_co2 * __instance.minCO2ToEmit; // subtract o2 in co2 from oxygen storage

                                __instance.accumulatedCO2 -= __instance.minCO2ToEmit;
                                equippable.GetComponent <Storage>().AddGasChunk(SimHashes.CarbonDioxide, __instance.minCO2ToEmit, Traverse.Create(__instance).Field("temperature").Field("value").GetValue <float>(), byte.MaxValue, 0, false, true);
                            }
                        }
                    }
                }
                if (flag != Traverse.Create(__instance).Field("hasAir").GetValue <bool>())
                {
                    Traverse.Create(__instance).Field("hasAirTimer").Method("Start").GetValue();
                    if (Traverse.Create(__instance).Field("hasAirTimer").Method("TryStop", 2f).GetValue <bool>())
                    {
                        Traverse.Create(__instance).Field("hasAir").SetValue(flag);
                    }
                }
                else
                {
                    Traverse.Create(__instance).Field("hasAirTimer").Method("Stop").GetValue();
                }
            }
        }