Example #1
0
 private static void Postfix(Valve __instance, ValveBase ___valveBase)
 {
     if (FluidWarpMod_Utils.IsWarpGate(___valveBase))
     {
         WarpSpaceManager.OnWarpGateChannelChange(___valveBase);
     }
 }
Example #2
0
        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);
        }
Example #3
0
 private static void Postfix(Valve __instance, ValveBase ___valveBase)
 {
     if (___valveBase.conduitType == GasWarpConfig.CONDUIT_TYPE || ___valveBase.conduitType == LiquidWarpConfig.CONDUIT_TYPE)
     {
         WarpSpaceManager.OnValveChannelChange(___valveBase);
     }
 }
Example #4
0
 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);
 }
Example #5
0
 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
     };
 }
Example #8
0
 private static bool Prefix(ValveBase __instance, float dt, int ___inputCell, int ___outputCell)
 {
     if (FluidWarpMod_Utils.IsWarpGate(__instance))
     {
         __instance.UpdateAnim();
         return(false);
     }
     return(true);
 }
Example #9
0
 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>();
        }
Example #11
0
        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");
        }
Example #12
0
        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");
        }
Example #13
0
        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);
        }
Example #15
0
        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");
        }
Example #18
0
        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");
        }
Example #19
0
 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");
        }
Example #21
0
        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);
        }
Example #22
0
 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;
     //    }
     //}
 }
Example #23
0
        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;
        }
Example #25
0
        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");
            }
        }
Example #26
0
        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");
        }
Example #28
0
        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");
        }
Example #29
0
 public ValveBaseExt(ValveBase vb)
 {
     this.ValveBase   = vb;
     this.ID          = ValveBase.GetInstanceID();
     this.FlowManager = getFlowManager();
 }
Example #30
0
 public bool isValidProvider()
 {
     Logger.Log(String.Format("WarpSpaceManager.RequestFluid2 Is valid provider {0}", FlowManager.HasConduit(ValveBase.GetInputCell())));
     return(ValveBase != null && FlowManager.HasConduit(ValveBase.GetInputCell()));
 }