Ejemplo n.º 1
0
        //public static ToolBase.ToolErrors CreateNode(NetInfo info, NetTool.ControlPoint startPoint, NetTool.ControlPoint middlePoint, NetTool.ControlPoint endPoint, FastList<NetTool.NodePosition> nodeBuffer,
        //                                             int maxSegments, bool test, bool visualize, bool autoFix, bool needMoney, bool invert, bool switchDir, ushort relocateBuildingID,
        //                                             out ushort node, out ushort segment, out int cost, out int productionRate)

        public override void SimulationStep()
        {
            base.SimulationStep();

            if (isHoveringSegment)
            {
                ushort node;
                ushort outSegment;
                int    cost;
                int    productionRate;
                // Initializes colliding arrays
                ToolErrors errors = NetTool.CreateNode(newPrefab != null ? newPrefab : segment.Info, startPoint, middlePoint, endPoint,
                                                       NetTool.m_nodePositionsSimulation, 1000, true, false, true, false, false, false, (ushort)0, out node, out outSegment, out cost, out productionRate);
            }
        }
Ejemplo n.º 2
0
        //public static ToolBase.ToolErrors CreateNode(NetInfo info, NetTool.ControlPoint startPoint, NetTool.ControlPoint middlePoint, NetTool.ControlPoint endPoint, FastList<NetTool.NodePosition> nodeBuffer,
        //                                             int maxSegments, bool test, bool visualize, bool autoFix, bool needMoney, bool invert, bool switchDir, ushort relocateBuildingID,
        //                                             out ushort node, out ushort segment, out int cost, out int productionRate)

        public override void SimulationStep()
        {
            ModDebug.LogClassAndMethodName(this.GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().Name);
            base.SimulationStep();

            if (isHoveringSegment)
            {
                ushort node;
                ushort outSegment;
                int    cost;
                int    productionRate;
                // Initializes colliding arrays
                ToolErrors errors = NetTool.CreateNode(newPrefab != null ? newPrefab : segment.Info, startPoint, middlePoint, endPoint,
                                                       NetTool.m_nodePositionsSimulation, 1000, true, false, true, false, false, false, (ushort)0, out node, out outSegment, out cost, out productionRate);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Called by the game every simulation step.
        /// Performs raycasting to select hovered instance.
        /// </summary>
        public override void SimulationStep()
        {
            // Get base mouse ray.
            Ray mouseRay = m_mouseRay;

            // Get raycast input.
            RaycastInput input = new RaycastInput(mouseRay, m_mouseRayLength)
            {
                m_rayRight                 = m_rayRight,
                m_netService               = GetService(),
                m_buildingService          = GetService(),
                m_propService              = GetService(),
                m_treeService              = GetService(),
                m_districtNameOnly         = Singleton <InfoManager> .instance.CurrentMode != InfoManager.InfoMode.Districts,
                m_ignoreTerrain            = GetTerrainIgnore(),
                m_ignoreNodeFlags          = GetNodeIgnoreFlags(),
                m_ignoreSegmentFlags       = GetSegmentIgnoreFlags(out input.m_segmentNameOnly),
                m_ignoreBuildingFlags      = GetBuildingIgnoreFlags(),
                m_ignoreTreeFlags          = GetTreeIgnoreFlags(),
                m_ignorePropFlags          = GetPropIgnoreFlags(),
                m_ignoreVehicleFlags       = GetVehicleIgnoreFlags(),
                m_ignoreParkedVehicleFlags = GetParkedVehicleIgnoreFlags(),
                m_ignoreCitizenFlags       = GetCitizenIgnoreFlags(),
                m_ignoreTransportFlags     = GetTransportIgnoreFlags(),
                m_ignoreDistrictFlags      = GetDistrictIgnoreFlags(),
                m_ignoreParkFlags          = GetParkIgnoreFlags(),
                m_ignoreDisasterFlags      = GetDisasterIgnoreFlags(),
                m_transportTypes           = GetTransportTypes()
            };

            // Enable ferry line selection.
            input.m_netService.m_itemLayers |= ItemClass.Layer.FerryPaths;

            ToolErrors    errors = ToolErrors.None;
            RaycastOutput output;

            // Cursor is dark by default.
            m_cursor = darkCursor;

            // Is the base mouse ray valid?
            if (m_mouseRayValid)
            {
                // Yes - raycast.
                if (RayCast(input, out output))
                {
                    // Set base tool accurate position.
                    m_accuratePosition = output.m_hitPos;

                    // Check for network hits.
                    if (output.m_netSegment != 0)
                    {
                        // Networks.
                        if (CheckSegment(output.m_netSegment, ref errors))
                        {
                            // CheckSegment passed - record hit position and set cursor to light cursor.
                            output.m_hitPos = Singleton <NetManager> .instance.m_segments.m_buffer[output.m_netSegment].GetClosestPosition(output.m_hitPos);
                            m_cursor        = lightCursor;
                        }
                        else
                        {
                            // CheckSegment failed - deselect segment.
                            output.m_netSegment = 0;
                        }
                    }

                    // Create new hover instance and set hovered type (if applicable).
                    InstanceID hoverInstance = InstanceID.Empty;
                    if (output.m_netSegment != 0)
                    {
                        hoverInstance.NetSegment = output.m_netSegment;
                    }

                    // Update tool hover instance.
                    m_hoverInstance = hoverInstance;
                }
                else
                {
                    // Raycast failed.
                    errors = ToolErrors.RaycastFailed;
                }
            }
            else
            {
                // No valid mouse ray.
                output = default;
                errors = ToolErrors.RaycastFailed;
            }

            // Set mouse position and record errors.
            m_mousePosition = output.m_hitPos;
            m_selectErrors  = errors;
        }
        private int ConvertSegments(string convertTo, string convertFrom, bool test, out int totalCost, out ToolErrors errors)
        {
            int num = 0;
            totalCost = 0;
            int tempCost = 0;
            int issues = 0;
            errors = 0;

            StringWriter sw = new StringWriter();
            //sw.WriteLine(String.Format("Entering ConvertObjects at {0}.", DateTime.Now.TimeOfDay));

            NetInfo info = PrefabCollection<NetInfo>.FindLoaded(convertTo);

            if (info == null)
            {
                //sw.WriteLine("Could not find the object: " + convertTo + ", aborting.");
                return num;
            }

            NetSegment[] buffer = Singleton<NetManager>.instance.m_segments.m_buffer;

            //sw.WriteLine("Filling Singleton<NetManager>.instance.m_segments.m_buffer. Found: " + buffer.Length);

            for (int i = 0; i < buffer.Length - 1; i++)
            {
                NetSegment segment = buffer[i];

                //Validate in selected area
                if (segment.Info == null)
                {
                    //sw.WriteLine(String.Format("Segment {0} is Null.", segment.Info.name));
                }
                else if (!segment.Info.name.Contains(convertFrom))
                {
                    //sw.WriteLine(String.Format("Segment {0} is not a converting item.", segment.Info.name));
                }
                else if (ValidateSelectedArea(segment) == false)
                {
                    //sw.WriteLine(String.Format("Segment {0} is not in the selected area.", segment.Info.name));
                }
                else
                {
                    bool skip = false;
                    //Are we not equal
                    bool Curved = AngleBetween(segment.m_startDirection, segment.m_endDirection, 1);

                    string seg = segment.Info.name;

                    NetTool.ControlPoint point;
                    NetTool.ControlPoint point2;
                    NetTool.ControlPoint point3;

                    bool Bridge = seg.Contains("Bridge ") == true;
                    bool Slope = seg.Contains("Slope ") == true;
                    bool Tunnel = seg.Contains("Tunnel ") == true;
                    bool Ground = types[(int)tp.Ground].isChecked;
                    //sw.WriteLine(String.Format("Ground: {0}; Bridge: {1}; Slope: {2}; Tunnel: {3}; Curved: {4}", Ground, Bridge, Slope, Tunnel, Curved));

                    // we need to handle Ground, Bridge, Elevated, Slope, Tunnel, railroads, Pipe, Power Lines, 
                    if (Ground == false && (Bridge || Slope || Tunnel || Curved)) { skip = true; }
                    else if (types[(int)tp.Tunnel].isChecked == false && seg.Contains("Tunnel")) { skip = true; }
                    else if (types[(int)tp.Bridge].isChecked == false && seg.Contains("Elevated")) { skip = true; }
                    else if (types[(int)tp.Slope].isChecked == false && seg.Contains("Slope")) { skip = true; }
                    else if (types[(int)tp.Curve].isChecked == false && Curved) { skip = true; }

                    //sw.WriteLine(segment.Info.name + " converting to " + convertTo + ".");
                    //sw.WriteLine("About to call GetSegmentControlPoints.\n");

                    GetSegmentControlPoints(i, out point, out point2, out point3);
                    bool visualize = false;
                    bool autoFix = true;
                    bool needMoney = true;
                    bool invert = false;
                    ushort num3 = 0;
                    ushort num4 = 0;
                    int num5 = 0;
                    int num6 = 0;

                    //test for bad index
                    if ((point.m_position == new Vector3()) && (point2.m_position == new Vector3()) && (point3.m_position == new Vector3())) { }
                    else if (skip == true) { }
                    else
                    {
                        try
                        {
                            //sw.WriteLine("About to call NetTool.Create test mode.\n");
                            //Validate in area and other errors (no money!)
                            errors = NetTool.CreateNode(info, point, point2, point3, NetTool.m_nodePositionsSimulation, 0x3e8, true, visualize, autoFix, needMoney, invert, false, 0, out num3, out num4, out num5, out num6);
                            //sw.WriteLine("Test Cost: " + num5);
                            tempCost = num5;
                        }
                        catch (Exception ex)
                        {
                            ARUT.WriteError("Error testing convert of: " + segment.Info.name + " to " + convertTo + ".", ex);
                        }
                        if (errors == 0)
                        {
                            try
                            {
                                errors = NetTool.CreateNode(info, point, point2, point3, NetTool.m_nodePositionsMain, 0x3e8, false, visualize, autoFix, needMoney, invert, false, 0, out num3, out num4, out num5, out num6);
                                num++;
                                totalCost += tempCost;
                            }
                            catch (Exception ex)
                            {
                                string lenght = "Left Segment Lenght: " + Math.Abs((float)(segment.m_startLeftSegment - segment.m_endLeftSegment)).ToString();
                                lenght += " Right Segment Lenght: " + Math.Abs((float)(segment.m_startRightSegment - segment.m_endRightSegment)).ToString();
                                string message = "Error converting: " + segment.Info.name + " to " + convertTo + "; errors: " + errors + "; " + lenght;
                                //sw.WriteLine(lenght);
                                ARUT.WriteError(message, ex);
                                //sw.WriteLine(message);
                                issues += 1;
                                try
                                {
                                    //lets retry this once
                                    errors = NetTool.CreateNode(info, point, point2, point3, NetTool.m_nodePositionsMain, 0x3e8, false, visualize, autoFix, needMoney, invert, false, 0, out num3, out num4, out num5, out num6);
                                    num++;
                                    totalCost += tempCost;

                                }
                                catch
                                { //do nothing }
                                }
                            }
                        }
                        else
                        {
                            //sw.WriteLine("Error test convert: " + segment.Info.name + " to " + convertTo + ". Message22: " + errors);
                            issues += 1;
                        }
                    }
                }
            }
            lInformation.text = "Items converted: " + num + " Total Cost: " + totalCost + " Recorded issues: " + issues;
            //WriteLog("" + sw);
            return num;
        }
Ejemplo n.º 5
0
 protected override bool CheckDisaster(ushort disaster, ref ToolErrors errors) => true;
Ejemplo n.º 6
0
 protected override bool CheckCitizen(ushort citizenInstance, ref ToolErrors errors) => true;
Ejemplo n.º 7
0
 protected override bool CheckParkedVehicle(ushort parkedVehicle, ref ToolErrors errors) => true;
Ejemplo n.º 8
0
 protected override bool CheckVehicle(ushort vehicle, ref ToolErrors errors) => true;
Ejemplo n.º 9
0
 protected override bool CheckTree(uint tree, ref ToolErrors errors) => true;
Ejemplo n.º 10
0
 protected override bool CheckProp(ushort prop, ref ToolErrors errors) => true;
Ejemplo n.º 11
0
 protected override bool CheckBuilding(ushort building, ref ToolErrors errors) => true;
Ejemplo n.º 12
0
 protected override bool CheckSegment(ushort segment, ref ToolErrors errors) => true;
Ejemplo n.º 13
0
 protected override bool CheckNode(ushort node, ref ToolErrors errors) => true;
Ejemplo n.º 14
0
        /// <summary>
        /// Called by the game every simulation step.
        /// Performs raycasting to select hovered instance.
        /// </summary>
        public override void SimulationStep()
        {
            // Get base mouse ray.
            Ray mouseRay = m_mouseRay;

            // Get raycast input.
            RaycastInput input = new RaycastInput(mouseRay, m_mouseRayLength)
            {
                m_rayRight                 = m_rayRight,
                m_netService               = GetService(),
                m_buildingService          = GetService(),
                m_propService              = GetService(),
                m_treeService              = GetService(),
                m_districtNameOnly         = Singleton <InfoManager> .instance.CurrentMode != InfoManager.InfoMode.Districts,
                m_ignoreTerrain            = GetTerrainIgnore(),
                m_ignoreNodeFlags          = GetNodeIgnoreFlags(),
                m_ignoreSegmentFlags       = GetSegmentIgnoreFlags(out input.m_segmentNameOnly),
                m_ignoreBuildingFlags      = GetBuildingIgnoreFlags(),
                m_ignoreTreeFlags          = GetTreeIgnoreFlags(),
                m_ignorePropFlags          = GetPropIgnoreFlags(),
                m_ignoreVehicleFlags       = GetVehicleIgnoreFlags(),
                m_ignoreParkedVehicleFlags = GetParkedVehicleIgnoreFlags(),
                m_ignoreCitizenFlags       = GetCitizenIgnoreFlags(),
                m_ignoreTransportFlags     = GetTransportIgnoreFlags(),
                m_ignoreDistrictFlags      = GetDistrictIgnoreFlags(),
                m_ignoreParkFlags          = GetParkIgnoreFlags(),
                m_ignoreDisasterFlags      = GetDisasterIgnoreFlags(),
                m_transportTypes           = GetTransportTypes()
            };

            // Enable ferry line selection.
            input.m_netService.m_itemLayers |= ItemClass.Layer.FerryPaths;

            ToolErrors    errors = ToolErrors.None;
            RaycastOutput output;

            // Cursor is dark by default.
            m_cursor = darkCursor;

            // Is the base mouse ray valid?
            if (m_mouseRayValid)
            {
                // Yes - raycast.
                if (RayCast(input, out output))
                {
                    // Set base tool accurate position.
                    m_accuratePosition = output.m_hitPos;

                    // Select parent building of any 'untouchable' (sub-)building.
                    if (output.m_building != 0 && (Singleton <BuildingManager> .instance.m_buildings.m_buffer[output.m_building].m_flags & Building.Flags.Untouchable) != 0)
                    {
                        output.m_building = Building.FindParentBuilding(output.m_building);
                    }

                    // Check for valid hits by type - network, building, prop, tree, in that order (so e.g. embedded networks can be selected).
                    if (output.m_netSegment != 0)
                    {
                        // Networks.
                        if (CheckSegment(output.m_netSegment, ref errors))
                        {
                            // CheckSegment passed - record hit position and set cursor to light.
                            output.m_hitPos = Singleton <NetManager> .instance.m_segments.m_buffer[output.m_netSegment].GetClosestPosition(output.m_hitPos);
                            m_cursor        = lightCursor;
                        }
                        else
                        {
                            // CheckSegment failed - deselect segment.
                            output.m_netSegment = 0;
                        }
                    }
                    else if (output.m_building != 0)
                    {
                        // Buildings.
                        if (CheckBuilding(output.m_building, ref errors))
                        {
                            // CheckSigment passed - record hit position and set cursor to light.
                            output.m_hitPos = Singleton <BuildingManager> .instance.m_buildings.m_buffer[output.m_building].m_position;
                            m_cursor        = lightCursor;
                        }
                        else
                        {
                            // CheckSegment failed - deselect building.
                            output.m_building = 0;
                        }
                    }
                    else if (output.m_propInstance != 0)
                    {
                        // Map props.
                        if (CheckProp(output.m_propInstance, ref errors))
                        {
                            // CheckSigment passed - record hit position and set cursor to light.
                            output.m_hitPos = Singleton <PropManager> .instance.m_props.m_buffer[output.m_propInstance].Position;
                            m_cursor        = lightCursor;
                        }
                        else
                        {
                            // CheckSegment failed - deselect prop.
                            output.m_propInstance = 0;
                        }
                    }
                    else if (output.m_treeInstance != 0)
                    {
                        // Map trees.
                        if (CheckTree(output.m_treeInstance, ref errors))
                        {
                            // CheckSigment passed - record hit position and set cursor to light.
                            output.m_hitPos = Singleton <TreeManager> .instance.m_trees.m_buffer[output.m_treeInstance].Position;
                            m_cursor        = lightCursor;
                        }
                        else
                        {
                            // CheckSegment failed - deselect tree.
                            output.m_treeInstance = 0u;
                        }
                    }


                    // Create new hover instance and set hovered type (if applicable).
                    InstanceID hoverInstance = InstanceID.Empty;
                    if (output.m_netSegment != 0)
                    {
                        hoverInstance.NetSegment = output.m_netSegment;
                    }
                    else if (output.m_building != 0)
                    {
                        hoverInstance.Building = output.m_building;
                    }
                    else if (output.m_propInstance != 0)
                    {
                        hoverInstance.Prop = output.m_propInstance;
                    }
                    else if (output.m_treeInstance != 0)
                    {
                        hoverInstance.Tree = output.m_treeInstance;
                    }

                    // Has the hovered instance changed since last time?
                    if (hoverInstance != m_hoverInstance)
                    {
                        // Hover instance has changed.
                        // Unhide any previously-hidden props, trees or buildings.
                        if (m_hoverInstance.Prop != 0)
                        {
                            // Unhide previously hovered prop.
                            if (Singleton <PropManager> .instance.m_props.m_buffer[m_hoverInstance.Prop].Hidden)
                            {
                                Singleton <PropManager> .instance.m_props.m_buffer[m_hoverInstance.Prop].Hidden = false;
                            }
                        }
                        else if (m_hoverInstance.Tree != 0)
                        {
                            // Unhide previously hovered tree.
                            if (Singleton <TreeManager> .instance.m_trees.m_buffer[m_hoverInstance.Tree].Hidden)
                            {
                                Singleton <TreeManager> .instance.m_trees.m_buffer[m_hoverInstance.Tree].Hidden = false;
                                Singleton <TreeManager> .instance.UpdateTreeRenderer(m_hoverInstance.Tree, updateGroup : true);
                            }
                        }
                        else if (m_hoverInstance.Building != 0)
                        {
                            // Unhide previously hovered building.
                            if ((Singleton <BuildingManager> .instance.m_buildings.m_buffer[m_hoverInstance.Building].m_flags & Building.Flags.Hidden) != 0)
                            {
                                Singleton <BuildingManager> .instance.m_buildings.m_buffer[m_hoverInstance.Building].m_flags &= ~Building.Flags.Hidden;
                                Singleton <BuildingManager> .instance.UpdateBuildingRenderer(m_hoverInstance.Building, updateGroup : true);
                            }
                        }

                        // Update tool hover instance.
                        m_hoverInstance = hoverInstance;
                    }
                }
                else
                {
                    // Raycast failed.
                    errors = ToolErrors.RaycastFailed;
                }
            }
            else
            {
                // No valid mouse ray.
                output = default;
                errors = ToolErrors.RaycastFailed;
            }

            // Set mouse position and record errors.
            m_mousePosition = output.m_hitPos;
            m_selectErrors  = errors;
        }