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