private static void Postfix(Valve __instance, ValveBase ___valveBase) { if (FluidWarpMod_Utils.IsWarpGate(___valveBase)) { WarpSpaceManager.OnWarpGateChannelChange(___valveBase); } }
public static bool Prefix(float dt, ValveBase __instance, float ___currentFlow, int ___outputCell, int ___inputCell, HandleVector <int> .Handle ___flowAccumulator) { ConduitFlow flowManager = Conduit.GetFlowManager(__instance.conduitType); if (!flowManager.HasConduit(___inputCell) || !flowManager.HasConduit(___outputCell)) { __instance.UpdateAnim(); } else { ConduitFlow.ConduitContents input_content = flowManager.GetConduit(___inputCell).GetContents(flowManager); ConduitFlow.ConduitContents output_content = flowManager.GetConduit(___outputCell).GetContents(flowManager); float mass_input = Mathf.Min(input_content.mass, ___currentFlow * dt); float mass_output = output_content.mass; float mass_limit = Mathf.Max(___currentFlow - mass_output, 0); // mass on output cannot exceed flow setting mass_input = Mathf.Min(mass_input, mass_limit); // set new input mass if (mass_input > 0f) { float disease_percent = mass_input / input_content.mass; int disease_count = (int)(disease_percent * input_content.diseaseCount); float mass_moved = flowManager.AddElement(___outputCell, input_content.element, mass_input, input_content.temperature, input_content.diseaseIdx, disease_count); Game.Instance.accumulators.Accumulate(___flowAccumulator, mass_moved); if (mass_moved > 0f) { flowManager.RemoveElement(___inputCell, mass_moved); } } __instance.UpdateAnim(); } return(false); }
private static void Postfix(Valve __instance, ValveBase ___valveBase) { if (___valveBase.conduitType == GasWarpConfig.CONDUIT_TYPE || ___valveBase.conduitType == LiquidWarpConfig.CONDUIT_TYPE) { WarpSpaceManager.OnValveChannelChange(___valveBase); } }
public static bool IsWarpGate(ValveBase vb) { return(vb.conduitType == FluidWarpMod_Utils.GAS_CONDUIT_PROVIDER_TYPE || vb.conduitType == FluidWarpMod_Utils.LIQUID_CONDUIT_PROVIDER_TYPE || vb.conduitType == FluidWarpMod_Utils.LIQUID_CONDUIT_REQUESTER_TYPE || vb.conduitType == FluidWarpMod_Utils.GAS_CONDUIT_REQUESTER_TYPE); }
private static void Postfix(Valve __instance, ValveBase ___valveBase) { if (___valveBase.conduitType == GasWarpConfig.CONDUIT_TYPE || ___valveBase.conduitType == LiquidWarpConfig.CONDUIT_TYPE) { WarpSpaceManager.RemoveProviderValve(___valveBase); } }
private static void BiggerCapacityPostfix(ValveBase __instance, BiggerCapacityState __state) { if (__instance.GetComponent <TogglableValve>()) { __instance.maxFlow *= 3; __instance.CurrentFlow = __state.CurrentFlow; } }
private static void BiggerCapacityPrefix(ValveBase __instance, out BiggerCapacityState __state) { __state = new BiggerCapacityState() { maxFlow = __instance.maxFlow, CurrentFlow = __instance.CurrentFlow }; }
private static bool Prefix(ValveBase __instance, float dt, int ___inputCell, int ___outputCell) { if (FluidWarpMod_Utils.IsWarpGate(__instance)) { __instance.UpdateAnim(); return(false); } return(true); }
private static bool Prefix(ValveBase __instance, float dt, int ___inputCell, int ___outputCell) { if (__instance.conduitType == LiquidWarpConfig.CONDUIT_TYPE || __instance.conduitType == GasWarpConfig.CONDUIT_TYPE) { __instance.UpdateAnim(); return(false); } return(true); }
public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag) { GeneratedBuildings.MakeBuildingAlwaysOperational(go); BuildingConfigManager.Instance.IgnoreDefaultKComponent(typeof(RequiresFoundation), prefab_tag); ValveBase valveBase = go.AddOrGet <ValveBase>(); valveBase.conduitType = CONDUIT_TYPE; valveBase.maxFlow = 10f; go.AddOrGet <Valve>(); }
public static void RemoveProviderValve(ValveBase valveBase) { Logger.LogFormat("==Enter WarpSpaceManager.RemoveProviderValve(valveBase={0})", valveBase); ValveChannels providers = getChannelsForConduitType(valveBase.conduitType); foreach (var channel in providers) { channel.Value.Remove(valveBase); } Logger.Log("==Exit WarpSpaceManager.RemoveProviderValve"); }
public static void OnWarpGateChannelChange(ValveBase valveBase) { Logger.LogFormat("==Enter WarpSpaceManager.OnValveChannelChange(valveBase={0} conduitType={1} inputCell={2} outputCell={3})", valveBase.GetInstanceID(), valveBase.conduitType, valveBase.GetInputCell(), valveBase.GetOutputCell()); int newChannel = Mathf.RoundToInt(valveBase.CurrentFlow * 1000f); RegisterWarpGate(valveBase, newChannel); Logger.Log("==Exit WarpSpaceManager.OnValveChannelChange"); }
public static bool Prefix(ValveBase __instance) { var controller = ((KBatchedAnimController)controllerFI.GetValue(__instance)); float averageRate = Game.Instance.accumulators.GetAverageRate(__instance.AccumulatorHandle); if (averageRate <= 0f) { controller.Play("off", KAnim.PlayMode.Once, 1f, 0f); } else { controller.Play("hi", (averageRate > 0f ? KAnim.PlayMode.Loop : KAnim.PlayMode.Once), 1f, 0f); } return(false); }
private static bool Prefix(ref Valve __instance, float amount, ref ValveBase ___valveBase, ref float ___desiredFlow) { if (!CustomizeBuildingsState.StateManager.State.NoDupeValves) { return(true); } ___desiredFlow = Mathf.Clamp(amount, 0.0f, ___valveBase.MaxFlow); KSelectable component = __instance.GetComponent <KSelectable>(); component.ToggleStatusItem(Db.Get().BuildingStatusItems.PumpingLiquidOrGas, ___desiredFlow >= 0.0, (object)___valveBase.AccumulatorHandle); __instance.UpdateFlow(); return(false); }
public static void RemoveWarpGate(ValveBase valveBase) { Logger.LogFormat("==Enter WarpSpaceManager.RemoveWarpGate(valveBase={0})", valveBase); var sourceDict = GetWarpGateDictionary(valveBase); var key = valveBase.GetInstanceID(); if (sourceDict.ContainsKey(key)) { sourceDict.Remove(key); } if (_liquidProviders.Count() + _liquidRequesters.Count() + _gasRequesters.Count() + _gasProviders.Count() == 0) { UnregisterConduitUpdate(); } Logger.Log("==Exit WarpSpaceManager.RemoveWarpGate"); }
public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag) { GeneratedBuildings.MakeBuildingAlwaysOperational(go); BuildingConfigManager.Instance.IgnoreDefaultKComponent(typeof(RequiresFoundation), prefab_tag); ValveBase valveBase = go.AddOrGet<ValveBase>(); valveBase.conduitType = ConduitType.Liquid; valveBase.maxFlow = 10f; valveBase.animFlowRanges = new ValveBase.AnimRangeInfo[3] { new ValveBase.AnimRangeInfo(3f, "lo"), new ValveBase.AnimRangeInfo(7f, "med"), new ValveBase.AnimRangeInfo(10f, "hi") }; go.AddOrGet<Valve>(); Workable workable = go.AddOrGet<Workable>(); workable.workTime = 5f; }
public static void RemoveProviderValve(ValveBase valveBase) { Logger.LogFormat("==Enter WarpSpaceManager.RemoveProviderValve(valveBase={0})", valveBase); ValveChannels providers = getChannelsForConduitType(valveBase.conduitType); int totalWarpGates = 0; foreach (var channel in providers) { channel.Value.Remove(valveBase); totalWarpGates += channel.Value.Count; } if (totalWarpGates == 0) { UnregisterConduitUpdate(); } Logger.Log("==Exit WarpSpaceManager.RemoveProviderValve"); }
public static void RegisterWarpGate(ValveBase valveBase, int newChannel) { Logger.LogFormat("==Enter WarpSpaceManager.RegisterWarpGate(valveBase={0}, valveChannel={1})", valveBase.GetInstanceID(), newChannel); var sourceDict = GetWarpGateDictionary(valveBase); var key = valveBase.GetInstanceID(); ValveBaseExt baseExt; if (sourceDict.TryGetValue(key, out baseExt)) { } else { baseExt = new ValveBaseExt(valveBase); sourceDict.Add(key, baseExt); } baseExt.Channel = newChannel; Logger.Log("==Exit WarpSpaceManager.RegisterWarpGate"); }
public static bool Prefix(ValveBase __instance) { if (__instance.conduitType == LiquidWarpConfig.CONDUIT_TYPE || __instance.conduitType == GasWarpConfig.CONDUIT_TYPE) { var controller = ((KBatchedAnimController)controllerFI.GetValue(__instance)); float averageRate = Game.Instance.accumulators.GetAverageRate(__instance.AccumulatorHandle); if (averageRate <= 0f) { controller.Play("off", KAnim.PlayMode.Once, 1f, 0f); } else { controller.Play("hi", (averageRate > 0f ? KAnim.PlayMode.Loop : KAnim.PlayMode.Once), 1f, 0f); } return(false); } return(true); }
public static void OnValveChannelChange(ValveBase valveBase) { Logger.LogFormat("==Enter WarpSpaceManager.OnValveChannelChange(valveBase={0} conduitType={1} inputCell={2} outputCell={3})", valveBase.GetInstanceID(), valveBase.conduitType, valveBase.GetInputCell(), valveBase.GetOutputCell()); ConduitFlow flowManager = getFlowManager(valveBase.conduitType); if (flowManager == null) { return; } int newChannel = Mathf.RoundToInt(valveBase.CurrentFlow * 1000f); SetProviderValveChannel(valveBase, newChannel); Logger.Log("==Exit WarpSpaceManager.OnValveChannelChange"); }
private static bool Prefix(ValveBase __instance, float dt, int ___inputCell, int ___outputCell) { if (__instance.conduitType != LiquidWarpConfig.CONDUIT_TYPE && __instance.conduitType != GasWarpConfig.CONDUIT_TYPE) { return(true); } int channelNo = Mathf.RoundToInt(__instance.CurrentFlow * 1000.0f); // simple cast to int sometimes gives invalid result Logger.LogFormat(" === ValveBase.ConduitUpdate({0}) Prefix conduitType={1}, inputCell={2}, outputCell={3}, channelNo={4}", dt, __instance.conduitType, ___inputCell, ___outputCell, channelNo); if (channelNo == 10000) { // Channel number is set to MaxFlow (10k), which means WarpGate is disabled return(false); } ConduitFlow flowManager = null; if (__instance.conduitType == LiquidWarpConfig.CONDUIT_TYPE) { flowManager = Conduit.GetFlowManager(ConduitType.Liquid); } else if (__instance.conduitType == GasWarpConfig.CONDUIT_TYPE) { flowManager = Conduit.GetFlowManager(ConduitType.Gas); } if (!flowManager.HasConduit(___inputCell) || !flowManager.HasConduit(___outputCell)) { __instance.UpdateAnim(); } if (flowManager.HasConduit(___outputCell) && !flowManager.IsConduitFull(___outputCell)) { WarpSpaceManager.RequestFluidFromChannel(__instance, channelNo); __instance.UpdateAnim(); return(false); } return(false); }
public static void Postfix(ValveBase __instance) { if (__instance is OperationalValve) { __instance.maxFlow *= 3f; } //else if (__instance.GetComponent<TogglableValve>()) //{ // __instance.maxFlow = 3f; // __instance.CurrentFlow *= 3f; // ValveBase.AnimRangeInfo[] animRanges = __instance.animFlowRanges; // for (int i = 0; i < animRanges.Length; i++) // { // //AnimRangeInfo is a struct, meaning it is CALL BY VALUE, not CALL BY REFERENCE. If the range variable is changed, it does not inherently change the range stored in the array. // ValveBase.AnimRangeInfo range = animRanges[i]; // range.minFlow *= __instance.maxFlow; // animRanges[i] = range; // } //} }
private static Dictionary <int, ValveBaseExt> GetWarpGateDictionary(ValveBase vb) { switch (vb.conduitType) { case FluidWarpMod_Utils.LIQUID_CONDUIT_PROVIDER_TYPE: return(_liquidProviders); case FluidWarpMod_Utils.LIQUID_CONDUIT_REQUESTER_TYPE: return(_liquidRequesters); case FluidWarpMod_Utils.GAS_CONDUIT_PROVIDER_TYPE: return(_gasProviders); case FluidWarpMod_Utils.GAS_CONDUIT_REQUESTER_TYPE: return(_gasRequesters); default: return(null); } }
public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag) { GeneratedBuildings.MakeBuildingAlwaysOperational(go); BuildingConfigManager.Instance.IgnoreDefaultKComponent(typeof(RequiresFoundation), prefab_tag); ValveBase valveBase = go.AddOrGet <ValveBase>(); valveBase.conduitType = CONDUIT_TYPE; //Begin with a maxFlow of 1KG as if the pressurized integration was not a part of this building. The proper flow will be set through Harmony on spawn. valveBase.maxFlow = 3f; valveBase.animFlowRanges = new ValveBase.AnimRangeInfo[3] { new ValveBase.AnimRangeInfo((0.25f * 3f), "lo"), new ValveBase.AnimRangeInfo((0.5f * 3f), "med"), new ValveBase.AnimRangeInfo((0.75f * 3f), "hi") }; go.AddOrGet <TogglableValve>(); Workable workable = go.AddOrGet <Workable>(); workable.workTime = 5f; }
private static void Prefix(ValveBase ___valveBase) { int inputCell = (int)Traverse.Create(___valveBase).Field("inputCell").GetValue(); int outputCell = (int)Traverse.Create(___valveBase).Field("outputCell").GetValue(); ConduitType conduitType = (ConduitType)Traverse.Create(___valveBase).Field("conduitType").GetValue(); Debug.Log("inputCell: " + inputCell); Debug.Log("outputCell: " + outputCell); if (true)//(conduitType == ConduitType.Gas) { Game.Instance.gasConduitSystem.RemoveLink(inputCell, outputCell); Debug.Log("OnSpawn RemoveLink Gas"); } if (true)//(conduitType == ConduitType.Liquid) { Game.Instance.liquidConduitSystem.RemoveLink(inputCell, outputCell); Debug.Log("OnSpawn RemoveLink Liquid"); } }
public override void ConfigureBuildingTemplate(GameObject go, Tag prefab_tag) { GeneratedBuildings.MakeBuildingAlwaysOperational(go); BuildingConfigManager.Instance.IgnoreDefaultKComponent(typeof(RequiresFoundation), prefab_tag); ValveBase valveBase = go.AddOrGet <ValveBase>(); valveBase.conduitType = CONDUIT_TYPE; valveBase.maxFlow = 10f; valveBase.animFlowRanges = new ValveBase.AnimRangeInfo[3] { new ValveBase.AnimRangeInfo((10f * 0.25f), "lo"), new ValveBase.AnimRangeInfo((10f * 0.5f), "med"), new ValveBase.AnimRangeInfo((10f * 0.75f), "hi") }; go.AddOrGet <Valve>(); Tintable tint = go.AddOrGet <Tintable>(); Tintable.AddToTintTable(ID, new Color32(255, 40, 40, 255)); Workable workable = go.AddOrGet <Workable>(); workable.workTime = 5f; }
public static void SetProviderValveChannel(ValveBase valveBase, int newChannel) { Logger.LogFormat("==Enter WaprSpaceManager.SetProviderValveChannel(valveBase={0}, valveChannel={1})", valveBase.GetInstanceID(), newChannel); ValveChannels providers = getChannelsForConduitType(valveBase.conduitType); foreach (var item in providers) { if (null != item.Value) { item.Value.Remove(valveBase); } } ValvesList valves; if (!providers.TryGetValue(newChannel, out valves)) { valves = new ValvesList(getFlowManager(valveBase.conduitType)); providers[newChannel] = valves; } valves.Add(valveBase); Logger.Log("==Exit WaprSpaceManager.SetProviderValveChannel"); }
public static void OnValveChannelChange(ValveBase valveBase) { Logger.LogFormat("==Enter WarpSpaceManager.OnValveChannelChange(valveBase={0})", valveBase.GetInstanceID()); ConduitFlow flowManager = null; if (valveBase.conduitType == LiquidWarpConfig.CONDUIT_TYPE) { flowManager = Conduit.GetFlowManager(ConduitType.Liquid); } else if (valveBase.conduitType == GasWarpConfig.CONDUIT_TYPE) { flowManager = Conduit.GetFlowManager(ConduitType.Gas); } else { return; } int newChannel = Mathf.RoundToInt(valveBase.CurrentFlow * 1000f); SetProviderValveChannel(valveBase, newChannel); Logger.Log("==Exit WarpSpaceManager.OnValveChannelChange"); }
public ValveBaseExt(ValveBase vb) { this.ValveBase = vb; this.ID = ValveBase.GetInstanceID(); this.FlowManager = getFlowManager(); }
public bool isValidProvider() { Logger.Log(String.Format("WarpSpaceManager.RequestFluid2 Is valid provider {0}", FlowManager.HasConduit(ValveBase.GetInputCell()))); return(ValveBase != null && FlowManager.HasConduit(ValveBase.GetInputCell())); }