protected override void OnDragTool(int cell, int distFromOrigin)
    {
        if (path.Count == 0)
        {
            return;
        }
        PathNode pathNode = path[path.Count - 1];

        if (pathNode.cell == cell)
        {
            return;
        }
        placeSound = GlobalAssets.GetSound("Place_building_" + def.AudioSize, false);
        Vector3       pos      = Grid.CellToPos(cell);
        EventInstance instance = SoundEvent.BeginOneShot(placeSound, pos);

        if (path.Count > 1)
        {
            int      num       = cell;
            PathNode pathNode2 = path[path.Count - 2];
            if (num == pathNode2.cell)
            {
                if ((Object)previousCellConnection != (Object)null)
                {
                    previousCellConnection.ConnectedEvent(previousCell);
                    KMonoBehaviour.PlaySound(GlobalAssets.GetSound("OutletDisconnected", false));
                    previousCellConnection = null;
                }
                previousCell = cell;
                CheckForConnection(cell, def.PrefabID, string.Empty, ref previousCellConnection, false);
                PathNode pathNode3 = path[path.Count - 1];
                Object.Destroy(pathNode3.visualizer);
                PathNode pathNode4 = path[path.Count - 1];
                TileVisualizer.RefreshCell(pathNode4.cell, def.TileLayer, def.ReplacementLayer);
                path.RemoveAt(path.Count - 1);
                buildingCount = ((buildingCount != 1) ? (buildingCount - 1) : (buildingCount = 14));
                instance.setParameterValue("tileCount", (float)buildingCount);
                SoundEvent.EndOneShot(instance);
                goto IL_029c;
            }
        }
        if (!path.Exists((PathNode n) => n.cell == cell))
        {
            bool valid = CheckValidPathPiece(cell);
            path.Add(new PathNode
            {
                cell       = cell,
                visualizer = null,
                valid      = valid
            });
            CheckForConnection(cell, def.PrefabID, "OutletConnected", ref previousCellConnection, true);
            buildingCount = buildingCount % 14 + 1;
            instance.setParameterValue("tileCount", (float)buildingCount);
            SoundEvent.EndOneShot(instance);
        }
        goto IL_029c;
IL_029c:
        visualizer.SetActive(path.Count < 2);
        ResourceRemainingDisplayScreen.instance.SetNumberOfPendingConstructions(path.Count);
    }
Ejemplo n.º 2
0
    public bool IconConnectionAnimation(float delay, int connectionCount, string defName, string soundName)
    {
        int num = Grid.PosToCell(base.transform.GetPosition());

        if (this.building.Def.Name.Contains(defName))
        {
            Building   building   = null;
            GameObject gameObject = Grid.Objects[num, 1];
            if ((UnityEngine.Object)gameObject != (UnityEngine.Object)null)
            {
                building = gameObject.GetComponent <Building>();
            }
            if ((UnityEngine.Object)building != (UnityEngine.Object)null)
            {
                bool flag = IsWire();
                int  num2 = (!flag) ? building.GetUtilityInputCell() : building.GetPowerInputCell();
                int  num3 = (!flag) ? building.GetUtilityOutputCell() : num2;
                if (num == num2 || num == num3)
                {
                    BuildingCellVisualizer component = building.gameObject.GetComponent <BuildingCellVisualizer>();
                    if ((UnityEngine.Object)component != (UnityEngine.Object)null && ((!flag) ? component.RequiresUtilityConnection : component.RequiresPower))
                    {
                        component.ConnectedEventWithDelay(delay, connectionCount, num, soundName);
                        return(true);
                    }
                }
            }
        }
        return(false);
    }
Ejemplo n.º 3
0
                public static void Postfix(BuildingCellVisualizer __instance, HashedString mode)
                {
                    var instance = Traverse.Create(__instance);
                    var building = instance.Field("building").GetValue <Building>();

                    var secondaryOutput = building.Def.BuildingComplete.GetComponent <ISecondaryOutput>();

                    if (secondaryOutput == null)
                    {
                        return;
                    }

                    ConduitType secondaryConduitType = secondaryOutput.GetSecondaryConduitType();

                    if (secondaryConduitType != ConduitType.Solid)
                    {
                        return;
                    }

                    var resources = instance.Field("resources").GetValue <BuildingCellVisualizerResources>();

                    var iconsField      = instance.Field("icons");
                    var icons           = iconsField.GetValue <Dictionary <GameObject, UnityEngine.UI.Image> >();
                    var visualizerField = instance.Field("secondaryOutputVisualizer");

                    if (icons == null)
                    {
                        return;
                    }

                    var visualizer = visualizerField.GetValue <GameObject>();

                    if (visualizer == null)
                    {
                        visualizer = Util.KInstantiate(Assets.UIPrefabs.ResourceVisualizer,
                                                       GameScreenManager.Instance.worldSpaceCanvas);
                        visualizer.transform.SetAsFirstSibling();
                        icons.Add(visualizer, visualizer.transform.GetChild(0).GetComponent <UnityEngine.UI.Image>());

                        visualizerField.SetValue(visualizer);

                        return;
                    }

                    if (mode != OverlayModes.SolidConveyor.ID || !building || !resources)
                    {
                        return;
                    }

                    var offset = secondaryOutput.GetSecondaryConduitOffset();

                    DrawUtilityIcon(ref icons,
                                    GetVisualizerCell(building, offset),
                                    resources.liquidOutputIcon,
                                    ref visualizer,
                                    BuildingCellVisualizer.secondOutputColour);

                    visualizerField.SetValue(visualizer);
                    iconsField.SetValue(icons);
                }
Ejemplo n.º 4
0
            public static void Postfix(BuildingCellVisualizer __instance, int cell)
            {
                //ConduitIO port = MultiIOExtensions.GetPortAt(__instance.gameObject, cell);
                GameObject obj = Grid.Objects[cell, 1];

                if (obj == null)
                {
                    return;
                }
                MultiInput  multiInput = obj.GetComponent <MultiInput>();
                MultiOutput multiOut   = obj.GetComponent <MultiOutput>();
                ConduitIO   port       = null;

                port = multiInput?.GetPortAt(cell);
                if (port == null)
                {
                    port = multiOut?.GetPortAt(cell);
                    if (port == null)
                    {
                        return;
                    }
                }
                if (port != null)
                {
                    GameObject visualizer = port.CellVisualizer;
                    SizePulse  pulse      = visualizer.AddComponent <SizePulse>();
                    pulse.speed            = 20f;
                    pulse.multiplier       = 0.75f;
                    pulse.updateWhenPaused = true;
                    pulse.onComplete       = (System.Action)Delegate.Combine(pulse.onComplete, (System.Action) delegate { UnityEngine.Object.Destroy(pulse); });
                }
            }
Ejemplo n.º 5
0
 private static void CallDrawUtilityIcon(BuildingCellVisualizer instance, int cell, Sprite icon, ref GameObject visualizer, Color tint, Color connectedColor)
 {
     object[] args = new object[7] {
         cell, icon, visualizer, tint, connectedColor, 1.5f, false
     };
     DrawUtilityIconMethod.Invoke(instance, args);
     //So that the visualizer ref carries over
     visualizer = (GameObject)args[2];
 }
        internal static void DrawUtilityIcon(this BuildingCellVisualizer __instance, int cell, Sprite icon_img, ref GameObject visualizerObj, Color tint, Color connectorColor, float scaleMultiplier = 1.5f, bool hideBG = false)
        {
            var mi = typeof(BuildingCellVisualizer).GetMethods(BindingFlags.InvokeMethod | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
                     .Where(m => m.Name == "DrawUtilityIcon" && m.GetParameters().Length == 7).First();

            if (mi != null)
            {
                var varlist = new object[] { cell, icon_img, visualizerObj, tint, connectorColor, scaleMultiplier, hideBG };
                mi.Invoke(__instance, varlist);
                visualizerObj = varlist[2] as GameObject;
            }
        }
Ejemplo n.º 7
0
            public static void Postfix(BuildingCellVisualizer __instance)
            {
                List <ConduitIO> ports = MultiIOExtensions.GetAllPortsFromObject(__instance.gameObject);

                foreach (ConduitIO outPort in ports)
                {
                    GameObject visualizer = outPort.CellVisualizer;
                    if (visualizer != null)
                    {
                        UnityEngine.Object.Destroy(visualizer);
                    }
                }
            }
        internal void Draw(GameObject obj, BuildingCellVisualizer visualizer, bool force)
        {
            Building building    = visualizer.GetBuilding();
            int      utilityCell = building.GetCellWithOffset(building.Orientation == Orientation.Neutral ? this.offset : this.offsetFlipped);

            // redraw if anything changed
            if (force || utilityCell != this.lastUtilityCell || color != this.lastColor)
            {
                this.lastColor       = color;
                this.lastUtilityCell = utilityCell;
                visualizer.DrawUtilityIcon(utilityCell, this.sprite, ref portObject, color, Color.white);
            }
        }
Ejemplo n.º 9
0
            public static void Postfix(BuildingCellVisualizer __instance)
            {
                List <ConduitIO> ports = MultiIOExtensions.GetAllPortsFromObject(__instance.gameObject);

                foreach (ConduitIO port in ports)
                {
                    GameObject visualizer = port.CellVisualizer;
                    if (visualizer != null)
                    {
                        visualizer.SetActive(false);
                    }
                }
            }
Ejemplo n.º 10
0
 public static bool Prefix(BuildingCellVisualizer __instance, HashedString mode)
 {
     if (buildings.Contains(__instance.GetBuilding().Def.PrefabID))
     {
         UnityEngine.GameObject go         = __instance.GetBuilding().gameObject;
         PortDisplayController  controller = go.GetComponent <PortDisplayController>();
         if (controller != null)
         {
             return(controller.Draw(__instance, mode, go));
         }
     }
     return(true);
 }
Ejemplo n.º 11
0
            public static void Postfix(BuildingCellVisualizer __instance, int cell)
            {
                ConduitIO port = MultiIOExtensions.GetPortAt(__instance.gameObject, cell);

                if (port != null)
                {
                    GameObject visualizer = port.CellVisualizer;
                    SizePulse  pulse      = visualizer.AddComponent <SizePulse>();
                    pulse.speed            = 20f;
                    pulse.multiplier       = 0.75f;
                    pulse.updateWhenPaused = true;
                    pulse.onComplete       = (System.Action)Delegate.Combine(pulse.onComplete, (System.Action) delegate { UnityEngine.Object.Destroy(pulse); });
                }
            }
        public bool Draw(BuildingCellVisualizer __instance, HashedString mode, GameObject go)
        {
            bool isNewMode = mode != this.lastMode;

            if (isNewMode)
            {
                this.ClearPorts();
                this.lastMode = mode;
            }

            foreach (PortDisplay2 port in this.GetPorts(mode))
            {
                port.Draw(go, __instance, isNewMode);
            }

            return(true);
        }
Ejemplo n.º 13
0
            public static void Postfix(HashedString mode, BuildingCellVisualizer __instance, Building ___building, BuildingCellVisualizerResources ___resources)
            {
                List <ConduitIO> ports      = MultiIOExtensions.GetAllPortsFromObject(___building.gameObject);
                Sprite           outputIcon = ___resources.gasOutputIcon;
                Sprite           inputIcon  = ___resources.gasInputIcon;

                if (OverlayModes.GasConduits.ID == mode)
                {
                    foreach (ConduitIO port in ports)
                    {
                        if (port.ConduitType == ConduitType.Gas)
                        {
                            CellOffset offset = port.CellOffset;
                            int        cell   = Grid.OffsetCell(___building.GetCell(), ___building.GetRotatedOffset(offset));
                            CallDrawUtilityIcon(__instance, cell, port is InputPort ? inputIcon : outputIcon, ref port.CellVisualizer, port.IconColor, Color.white);
                        }
                    }
                }
                else if (OverlayModes.LiquidConduits.ID == mode)
                {
                    foreach (ConduitIO port in ports)
                    {
                        if (port.ConduitType == ConduitType.Liquid)
                        {
                            CellOffset offset = port.CellOffset;
                            int        cell   = Grid.OffsetCell(___building.GetCell(), ___building.GetRotatedOffset(offset));
                            CallDrawUtilityIcon(__instance, cell, port is InputPort ? inputIcon : outputIcon, ref port.CellVisualizer, port.IconColor, Color.white);
                        }
                    }
                }
                else if (OverlayModes.SolidConveyor.ID == mode)
                {
                    foreach (ConduitIO port in ports)
                    {
                        if (port.ConduitType == ConduitType.Solid)
                        {
                            CellOffset offset = port.CellOffset;
                            int        cell   = Grid.OffsetCell(___building.GetCell(), ___building.GetRotatedOffset(offset));
                            CallDrawUtilityIcon(__instance, cell, port is InputPort ? inputIcon : outputIcon, ref port.CellVisualizer, port.IconColor, Color.white);
                        }
                    }
                }
            }
Ejemplo n.º 14
0
                public static void Postfix(BuildingCellVisualizer __instance, HashedString mode)
                {
                    Traverse         traverse1 = Traverse.Create((object)__instance);
                    Building         building  = traverse1.Field("building").GetValue <Building>();
                    ISecondaryOutput component = building.Def.BuildingComplete.GetComponent <ISecondaryOutput>();

                    if (component == null || component.GetSecondaryConduitType() != ConduitType.Solid)
                    {
                        return;
                    }
                    BuildingCellVisualizerResources visualizerResources = traverse1.Field("resources").GetValue <BuildingCellVisualizerResources>();
                    Traverse traverse2 = traverse1.Field("icons");
                    Dictionary <GameObject, Image> icons = traverse2.GetValue <Dictionary <GameObject, Image> >();
                    Traverse traverse3 = traverse1.Field("secondaryOutputVisualizer");

                    if (icons == null)
                    {
                        return;
                    }
                    GameObject visualizerObj = traverse3.GetValue <GameObject>();

                    if ((UnityEngine.Object)visualizerObj == (UnityEngine.Object)null)
                    {
                        GameObject key = Util.KInstantiate(Assets.UIPrefabs.ResourceVisualizer, GameScreenManager.Instance.worldSpaceCanvas, (string)null);
                        key.transform.SetAsFirstSibling();
                        icons.Add(key, key.transform.GetChild(0).GetComponent <Image>());
                        traverse3.SetValue((object)key);
                    }
                    else
                    {
                        if (mode != OverlayModes.SolidConveyor.ID || !(bool)((UnityEngine.Object)building) || !(bool)((UnityEngine.Object)visualizerResources))
                        {
                            return;
                        }
                        CellOffset secondaryConduitOffset = component.GetSecondaryConduitOffset();
                        InfiniteSourceSinkPatches.Db_Initialize_Patch.DrawUtilityIcon(ref icons, InfiniteSourceSinkPatches.Db_Initialize_Patch.GetVisualizerCell(building, secondaryConduitOffset), visualizerResources.liquidOutputIcon, ref visualizerObj, (Color)BuildingCellVisualizer.secondOutputColour);
                        traverse3.SetValue((object)visualizerObj);
                        traverse2.SetValue((object)icons);
                    }
                }
Ejemplo n.º 15
0
            public static void Postfix(int cell, string defName, string soundName, bool fireEvents, ref bool __result)
            {
                //Only need to patch if the result was false and a pipe is being checked (liquid/gas)
                if (__result)
                {
                    return;
                }
                if (!defName.Contains("Conduit"))
                {
                    return;
                }
                Building building = Grid.Objects[cell, 1]?.GetComponent <Building>();

                if (building == null)
                {
                    return;
                }

                ConduitIO port = MultiIOExtensions.GetPortAt(building.gameObject, cell);

                if (port == null)
                {
                    return;
                }

                ConduitType type      = port.ConduitType;
                string      nameCheck = "";

                if (type == ConduitType.Gas)
                {
                    nameCheck = "Gas";
                }
                else if (type == ConduitType.Liquid)
                {
                    nameCheck = "Liquid";
                }
                else if (type == ConduitType.Solid)
                {
                    nameCheck = "Solid";
                }
                if (nameCheck == "" || !defName.Contains(nameCheck))
                {
                    return;
                }

                BuildingCellVisualizer bcv = building.GetComponent <BuildingCellVisualizer>();

                if (bcv != null)
                {
                    if (fireEvents)
                    {
                        bcv.ConnectedEvent(cell);
                        string sound = GlobalAssets.GetSound(soundName);
                        if (sound != null)
                        {
                            KMonoBehaviour.PlaySound(sound);
                        }
                    }
                    __result = true;
                }
            }
 internal static Building GetBuilding(this BuildingCellVisualizer __instance)
 {
     return(ReadPrivate.Get(typeof(BuildingCellVisualizer), __instance, "building") as Building);
 }
    private bool CheckForConnection(int cell, string defName, string soundName, ref BuildingCellVisualizer outBcv, bool fireEvents = true)
    {
        outBcv = null;
        DebugUtil.Assert(defName != null, "defName was null");
        Building building = GetBuilding(cell);

        if (!(bool)building)
        {
            return(false);
        }
        DebugUtil.Assert(building.gameObject, "targetBuilding.gameObject was null");
        int num  = -1;
        int num2 = -1;
        int num3 = -1;

        if (defName.Contains("LogicWire"))
        {
            LogicPorts component = building.gameObject.GetComponent <LogicPorts>();
            if ((Object)component != (Object)null)
            {
                if (component.inputPorts != null)
                {
                    foreach (ILogicUIElement inputPort in component.inputPorts)
                    {
                        DebugUtil.Assert(inputPort != null, "input port was null");
                        if (inputPort.GetLogicUICell() == cell)
                        {
                            num = cell;
                            break;
                        }
                    }
                }
                if (num == -1 && component.outputPorts != null)
                {
                    foreach (ILogicUIElement outputPort in component.outputPorts)
                    {
                        DebugUtil.Assert(outputPort != null, "output port was null");
                        if (outputPort.GetLogicUICell() == cell)
                        {
                            num2 = cell;
                            break;
                        }
                    }
                }
            }
        }
        else if (defName.Contains("Wire"))
        {
            num  = building.GetPowerInputCell();
            num2 = building.GetPowerOutputCell();
        }
        else if (defName.Contains("Liquid"))
        {
            if (building.Def.InputConduitType == ConduitType.Liquid)
            {
                num = building.GetUtilityInputCell();
            }
            if (building.Def.OutputConduitType == ConduitType.Liquid)
            {
                num2 = building.GetUtilityOutputCell();
            }
            ElementFilter component2 = building.GetComponent <ElementFilter>();
            if ((Object)component2 != (Object)null)
            {
                DebugUtil.Assert(component2.portInfo != null, "elementFilter.portInfo was null A");
                if (component2.portInfo.conduitType == ConduitType.Liquid)
                {
                    num3 = component2.GetFilteredCell();
                }
            }
        }
        else if (defName.Contains("Gas"))
        {
            if (building.Def.InputConduitType == ConduitType.Gas)
            {
                num = building.GetUtilityInputCell();
            }
            if (building.Def.OutputConduitType == ConduitType.Gas)
            {
                num2 = building.GetUtilityOutputCell();
            }
            ElementFilter component3 = building.GetComponent <ElementFilter>();
            if ((Object)component3 != (Object)null)
            {
                DebugUtil.Assert(component3.portInfo != null, "elementFilter.portInfo was null B");
                if (component3.portInfo.conduitType == ConduitType.Gas)
                {
                    num3 = component3.GetFilteredCell();
                }
            }
        }
        if (cell == num || cell == num2 || cell == num3)
        {
            BuildingCellVisualizer buildingCellVisualizer = outBcv = building.gameObject.GetComponent <BuildingCellVisualizer>();
            if (((Object)buildingCellVisualizer != (Object)null) ? true : false)
            {
                if (fireEvents)
                {
                    buildingCellVisualizer.ConnectedEvent(cell);
                    string sound = GlobalAssets.GetSound(soundName, false);
                    if (sound != null)
                    {
                        KMonoBehaviour.PlaySound(sound);
                    }
                }
                return(true);
            }
        }
        outBcv = null;
        return(false);
    }